package cn.itcast.dmp

import cn.itcast.dmp.config.AppConfigHelper
import org.apache.spark.SparkConf
import cn.itcast.dmp.config.AppConfigHelper
import org.apache.spark.SparkConf
import org.apache.spark.internal.Logging
import org.apache.spark.sql.SparkSession

//继承logging接口，记录日志
object DmpApp extends Logging {
  def main(args: Array[String]): Unit = {
    // TODO：1、构建SparkSession实例对象，设置相关应用参数
    val spark: SparkSession = {
      // a. 创建SparkConf实例对象，设置应用名称
      var sparkConf: SparkConf = new SparkConf().setAppName(this.getClass.getSimpleName.stripSuffix("$"))
      // b. 判断应用运行模式（本地模式还是集群模式，如是本地模式，直接设置值；如是集群模式，通过spark-submit --master）
      if (AppConfigHelper.SPARK_APP_LOCAL_MODE.toBoolean) {
        //如果是本地模式，就选取application.conf文件中的spark.master=local[4]
        sparkConf.setMaster(AppConfigHelper.SPARK_APP_MASTER)
      }
      // c. 建造者模式创建SparkSession实例对象
      import cn.itcast.dmp.config.SparkConfigHelper._
      val session: SparkSession = SparkSession.builder()
        .config(sparkConf) //因为config返回的是一个build对象，所以要加载其他配置信息必须是build类型，
        // 加载应用配置信息， 通过隐式转换（自定义隐式转换函数实现） 从而实现动态加载属性
        .loadSparkConf()
        .getOrCreate()

      //记录日志
      logInfo("sparkapplication---Info---")
      logInfo("sparkapplication---WARN---")
      logInfo("sparkapplication---Error---")

      // d. 返回会话实例
      session
    }

    // 开发测试，为了查看WEB UI监控4040端口，让线程休眠
    Thread.sleep(100000)

    // 当应用运行完成，关闭资源
    spark.stop()

  }
}
